package com.tian;

import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * {@code @description:} TODO
 *
 * @author tianwc 公众号：Java后端技术全栈
 * 在线刷题 1200+java面试题和1000+篇技术文章：<a href="https://woaijava.cc/">博客地址</a>
 * {@code @date:} 2025-02-28 11:09
 * {@code @version:} 1.0
 */
@Configuration
@ConditionalOnClass(RabbitTemplate.class)
@EnableConfigurationProperties(LogStarterProperties.class)
public class LogAutoConfiguration {

    /**
     * 定义一个RabbitTemplate的Bean，用于在Spring应用中发送和接收消息。
     * 如果Spring容器中已经存在RabbitTemplate类型的Bean，则不会创建新的实例。
     * @param connectionFactory 提供给RabbitTemplate的连接工厂，用于创建与RabbitMQ服务器的连接。
     * @param messageConverter 消息转换器，用于将Java对象转换为消息格式，或者将消息格式转换为Java对象。
     * @return 新创建的RabbitTemplate实例，已经配置了消息转换器。
     */
    @Bean
    @ConditionalOnMissingBean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory,
                                         MessageConverter messageConverter) {
        RabbitTemplate template = new RabbitTemplate(connectionFactory);
        template.setMessageConverter(messageConverter);
        return template;
    }

    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    @Bean
    public LogSender logSender(RabbitTemplate rabbitTemplate, LogStarterProperties properties) {
        return new LogSender(rabbitTemplate,
                properties.getExchange(),
                properties.getRoutingKey(),
                properties.isEnabled());
    }
}
